____ _ _ _ _
| _ \ ___ | |_ (_) _ __ ___ __| | (_) __ _
| |_) | / _ \ | __| | | | '_ \ / _ \ / _| | | | / _ |
| _ < | __/ | |_ | | | |_) | | __/ | (_| | | | | (_| |
|_| \_\ \___| \__| |_| | .__/ \___| \__,_| |_| \__,_|
|_|
- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b
ÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻ
Programmfehler
ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
top
Programmfehler oder Softwarefehler oder Software-Anomalie, häufig auch Bug (englisch) genannt, sind Begriffe aus der Softwaretechnik, mit denen fĂźr Software-Systemkomponenten Abweichungen zu einem geforderten oder gewĂźnschten Sollzustand bezeichnet werden. Diese kĂśnnen auftreten, wenn z. B. eine bestimmte Festlegung der Spezifikation fehlerhaft ist oder falsch umgesetzt wurde (âFehlhandlungâ), und fĂźhren zunächst zu einem internen âFehlerzustandâ im Programm, der wiederum während der ProgrammausfĂźhrung zu einem unerwarteten Verhalten oder Ergebnis fĂźhrt oder fĂźhren kann (âFehlerwirkungâ).
Zur mĂśglichst vollständigen Erkennung und Behebung von Programmfehlern wird Ăźblicherweise in den Prozessen der Softwareentwicklung, d. h. vor dem tatsächlichen, âproduktivenâ Einsatz von Software, die Projektphase âSoftwaretestâ durchlaufen, wobei eine Validierung durchgefĂźhrt wird. Dabei auftretende Fehler sind Ăźblich und sie zu finden ist Ziel des Testens,cite-ref-pks-1-0[1] während Fehler im laufenden Betrieb je nach Fehlerwirkung u. U. kritische Anomalien/StĂśrungen darstellen. In der Praxis treten Computerprogramme ohne Programmfehler selten auf. Als Qualitätsmerkmal fĂźr Programme kennt man u. a. die Fehlerdichte. Sie bezeichnet die Anzahl an Fehlern pro 1.000 Zeilen Code (Kilo Source Lines of Code) bzw. je Function Point.
Als spezielle Instrumente zur Suche nach den Ursachen fĂźr Fehler in Programmen sind sogenannte Debugger hilfreich, mit denen ein Programm Schritt fĂźr Schritt ausgefĂźhrt und kontrolliert werden kann. Bei besonders kritischer Software (z. B. Flugzeugsteuerung) wird mitunter eine (aufwendige) formale Verifikation durchgefĂźhrt.
Zur Erfassung und Dokumentation werden sogenannte Bugtracker (wie Bugzilla oder Mantis) eingesetzt. Diese nehmen sowohl Fehlerberichte als auch Verbesserungsvorschläge und Wßnsche (sog. Feature-Requests) der Nutzer oder allgemeine Vorgänge auf. Siehe auch Fehlermanagement.
Der Vorgang des Beseitigens eines Programmfehlers wird umgangssprachlich Bugfixing genannt. Das Ergebnis der Verbesserung wird in der Fachsprache als Bugfix, Patch oder Softwarepatch bezeichnet.
Contents
⢠Definitionen
⢠Beim Testen
⢠Im Betrieb
⢠Fehlerfreiheit
⢠Literatur
⢠Weblinks
⢠Einzelnachweise
ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
Definitionen
Ein Programm- oder Softwarefehler ist, angelehnt an die allgemeine Definition fĂźr âFehlerâ
âNichterfĂźllung einer Anforderungâ.cite-ref-iso-9000-2-0[2]
Konkret definiert sich der Fehler danach als
âAbweichung des IST (beobachtete, ermittelte, berechnete Zustände oder Vorgänge) vom SOLL (festgelegte, korrekte Zustände und Vorgänge), wenn sie die vordefinierte Toleranzgrenze [die auch 0 sein kann] Ăźberschreitet.â
⢠eine Fehlhandlung (englisch Error)
âdie menschliche Handlung, die zu einem Fehlerzustand fĂźhrt ([nach IEEE 610])â
⢠⌠fßhrt zu einem Fehlerzustand (engl. Defect)
âDefekt (innerer Fehlerzustand) in einer Komponente oder einem System, der eine geforderte Funktion des Produktes beeinträchtigen kann âŚâ
⢠der eine Fehlerwirkung (engl. Failure) nach sich ziehen kann
âDie Manifestierung eines inneren Fehlers bei der AusfĂźhrung [des Programms] als ein inkorrektes Verhalten oder Resultat bzw. als Versagen des Systems.â
Beispiel Division durch null: Fehlhandlung: Null als mÜglicher Divisor wurde nicht geprßft/ausgeschlossen; Fehlerzustand: Das Programm ist (ggf. unbemerkt) fehlerhaft; Fehlerwirkung: Bei Auftreten eines Nullwerts als Divisor tritt während der Ausfßhrung des Befehls ein Laufzeitfehler auf.
Als Synonym fĂźr âFehlerâ oder ergänzend dazu sind auch AusdrĂźcke wie Problem, Defekt, Abweichung, Anomalie, Mangel gebräuchlich. Damit kann die âFehlerschwereâ auch begrifflich unterschieden werden, z. B. die Verletzung von Vorschriften zum Programmierstil, die Lieferung falscher Ergebnisse oder ein Programmabbruch.
âBugâ als Synonym fĂźr Programmfehler
Das Wort bug bedeutet im Englischen âSchnabelkerf; Wanzeâ und umgangssprachlich âlandlebender GliederfĂźĂerâ oder â(insektenartiges) Ungezieferâ.cite-ref-4[4] Im Jargon amerikanischer Ingenieure ist seit dem späten 19. Jahrhundert die Bedeutung âFehlfunktionâ oder auch âKonstruktionsfehlerâ bezeugt; diesem Wortgebrauch liegt die (scherzhafte) Vorstellung zugrunde, dass sich kleines Krabbelvieh am Getriebe, der Leitung usw. zu schaffen macht. Die ältesten Belege sind zwei Briefe Thomas Edisons aus dem Jahr 1878 an William Orton, den Präsidenten der Telegraphiegesellschaft Western Union, bzw. Tivadar PuskĂĄs, den Erfinder der Telefonzentrale, in denen es heiĂt:
â[âŚ] I did find a âbugâ in my apparatus, but it was not in the telephone proper. It was of the genus âcallbellum.âcite-ref-5[5]â
â[âŚ] Ich fand in der Tat einen âBugâ in meinem Apparat, allerdings nicht im Telefon selbst. Er war von der Gattung âcallbellumâ.â
â
Thomas Edison in einem Brief an William Orton, datiert auf den 3. März 1878
sowie
âThe first step [in all of my inventions] is an intuition, and comes with a burst, then difficulties arise â this thing gives out and [it is] then that âBugsâ â as such little faults and difficulties are called â show themselves [âŚ].â
âDer erste Schritt [bei all meinen Erfindungen] ist ein intuitiver Gedanke, der in einem Ausbruch kommt, doch dann tauchen Schwierigkeiten auf â das Ding funktioniert nicht mehr und [es ist] dann, dass âBugsâ â wie solche kleinen Fehler und Schwierigkeiten genannt werden â sich zeigen [âŚ].â
â
Thomas Edison in einem Brief an Tivadar PuskĂĄs, datiert auf den 18. November 1878
Edison ist zwar nicht Erfinder, aber immerhin Kronzeuge fĂźr eine schon damals kursierende Bedeutung des Wortes. Die VerknĂźpfung des Begriffs mit Computern geht mĂśglicherweise auf die Computerpionierin Grace Hopper zurĂźck. Sie verbreitete die Geschichte, dass am 9. September 1945 eine Motte in einem Relais des Computers Mark II Aiken Relay Calculator zu einer Fehlfunktion fĂźhrte. Die Motte wurde entfernt, in das Logbuch geklebt und mit folgender Notiz versehen: âFirst actual case of bug being found.â (deutsch: âDas erste Mal, dass tatsächlich ein âUngezieferâ gefunden wurde.â). Die Legende der Begriffsfindung hält sich hartnäckig, obwohl die Logbuch-Eintragung gerade darauf verweist, dass der Begriff schon zuvor gängig war. Zudem irrte Grace Hopper sich hinsichtlich des Jahres: Der Vorfall ereignete sich tatsächlich am 9. September 1947. Die entsprechende Seite des Logbuchs wurde bis Anfang der 1990er Jahre am Naval Surface Warfare Center Computer Museum der US-Marine in Dahlgren, Virginia, aufbewahrt. Zurzeit befindet sich diese Logbuchseite mit der Motte am Smithsonian Institute.cite-ref-7[7]
Arten von Programmfehlern
In der Softwaretechnik (siehe auchcite-ref-unio-8-0[8]) wird zwischen folgenden Typen von Fehlern in Programmen unterschieden:
⢠Lexikalische Fehler sind nicht interpretierbare Zeichenketten, also undefinierte Bezeichner (Variablen, Funktionen, Literale...)
⢠Syntaxfehler sind VerstĂśĂe gegen die grammatischen Regeln der benutzten Programmiersprache, zum Beispiel die falsche Verwendung reservierter Symbole (z. B. fehlende Klammern), Typkonflikte, falsche Anzahl Parameter.
Lexikalische und Syntaxfehler verhindern in der Regel die Kompilierung des fehlerhaften Programms und werden daher frĂźhzeitig erkannt. Bei Programmiersprachen, die sequentiell interpretiert werden, bricht das Programm Ăźblicherweise erst an der syntaktisch/lexikalisch fehlerhaften Stelle ab.
⢠Semantische Fehler sind Fehler, in denen eine programmierte Anweisung zwar syntaktisch fehlerfrei, aber inhaltlich trotzdem fehlerhaft ist, zum Beispiel Verwechslung des Befehlscodes, syntaktisch nicht erkennbare falsche Parameterreihenfolge.
⢠Logische Fehler bestehen in einem im Detail falschen ProblemlÜsungsansatz, beispielsweise auf Grund eines Fehlschlusses, einer falsch interpretierten Spezifikation oder einfach eines Versehens oder Schreibfehlers. Beispiele: plus statt minus, kleiner statt kleiner/gleich usw. Die Toleranz gegenßber solchen Fehlern und die diese einschränken sollende Attributgrammatik von Programmiersprachen, wie etwa bei der Zuweisungskompatibilität von Datentypen, sind je nach verwendeter Programmiersprache sehr unterschiedlich ausgeprägt und kÜnnen schwierig zu ßberschauende Sicherheitslßcken und Programmabstßrze verursachen.
⢠Designfehler sind Fehler im Grundkonzept, entweder bei der Definition der Anforderungen an die Software, oder bei der Entwicklung des Softwaredesigns, auf dessen Grundlage das Programm entwickelt wird. Fehler bei der Anforderungsdefinition beruhen oft auf mangelnder Kenntnis des Fachgebietes, fßr das die Software geschrieben wird oder auf Missverständnissen zwischen Nutzern und Entwicklern. Fehler direkt im Softwaredesign hingegen sind oft auf mangelnde Erfahrung der Softwareentwickler, unstrukturierte Programmierung oder auf Folgefehler durch Fehler in der Anforderungsspezifikation zurßckzufßhren. In anderen Fällen ist das Design historisch gewachsen und wird mit der Zeit unßbersichtlich, was wiederum zu Designfehlern bei Weiterentwicklungen des Programms fßhren kann. Oftmals wird ohne Vorliegen eines richtigen Konzepts direkt programmiert, was dann insbesondere bei hÜherem Komplexitätsgrad der Software zu Designfehlern fßhren kann. Sowohl fßr Fehler in der Anforderungsdefinition als auch im Softwaredesign kommen darßber hinaus vielfach Kosten- oder Zeitdruck in Frage. Ein typischer Designfehler ist die Codewiederholung, die zwar nicht unmittelbar zu Programmfehlern fßhrt, aber bei der Softwarewartung, der Modifikation oder der Erweiterung von Programmcode sehr leicht ßbersehen werden kann und dann unweigerlich zu unerwßnschten Effekten fßhrt.
⢠Fehler im Bedienkonzept. Das Programm verhält sich anders als es einzelne oder viele Anwender erwarten, obwohl es technisch an sich fehlerfrei arbeitet.
Sonstige Fehlerbegriffe regressionsbug
⢠Laufzeitfehler: Während die vorgenannten Fehler ein tatsächlich fehlerhaftes Programm bedeuten, das entweder nicht ausfĂźhrbar ist oder fehlerhafte Ergebnisse liefert, kann auch ein âkorrektesâ Programm bei seiner AusfĂźhrung zu Fehlern fĂźhren. Laufzeitfehler sind alle Arten von Fehlern, die auftreten, während das Programm abgearbeitet wird. Je nach Situation kann die Ursache beispielsweise eine unpassenden Programmumgebung sein (z. B. eine falsche Betriebssystem-Version, falsche Parameter beim Aufruf des Programms (auch als Unterprogramm), falsche Eingabedaten etc.)
Laufzeitfehler kĂśnnen sich auf die unterschiedlichsten Arten zeigen. Oftmals zeigt das Programm ungewĂźnschtes Verhalten, im Extremfall wird die AusfĂźhrung des Programms abgebrochen (âAbsturzâ), oder das Programm geht in einen Zustand Ăźber, in dem es keine Benutzereingaben mehr akzeptiert (âEinfrierenâ, âHängenâ). Wird in Programmiersprachen ohne automatische Speicherbereinigung (etwa C oder C++) Speicher nach der Verwendung nicht mehr freigegeben, so wird durch das Programm auf Dauer immer mehr Speicher belegt. Diese Situation wird Speicherleck genannt. Aber auch in Programmiersprachen mit automatischer Speicherbereinigung (etwa Java oder C#) kĂśnnen ähnliche Probleme auftreten, wenn zum Beispiel Objekte durch systemnahe Programmierung unkontrolliert angesammelt werden. Noch kritischer sind versehentlich vom Programmierer freigegebene Speicherbereiche, die oft trotzdem noch durch hängende Zeiger referenziert werden, da dies zu vĂśllig unkontrolliertem Verhalten der Software fĂźhren kann. Manche Laufzeitumgebungen erlauben daher solche programmierbaren Speicherfreigaben grundsätzlich nicht. Des Weiteren gibt es auch Bugs im Zusammenspiel mit anderen Programmen.
⢠Fehler im Compiler, der Laufzeitumgebung oder sonstigen Bibliotheken. Solche Fehler sind meist besonders schwer nachzuvollziehen, da das Verhalten des Programms in solchen Fällen nicht seiner Semantik entspricht. Insbesondere von Compiler und Laufzeitumgebung wird daher besondere Zuverlässigkeit erwartet.
⢠Ein Regressionsbug (Regression bedeutet âRĂźckschrittâ) ist ein Fehler, der erst in einer späteren Programmversion auftaucht. Dies sind häufig unerkannte Nebeneffekte von Fehlerbehebungen oder Programmänderungen an anderer Stelle.
⢠Fehler als Folge physikalischer Betriebsbedingungen. Verschiedenste Begebenheiten wie elektromagnetische Felder, Strahlen, Temperaturschwankungen, ErschĂźtterungen usw. kĂśnnen auch bei sonst einwandfrei konfigurierten und innerhalb der Spezifikationen betriebenen Systemen zu Fehlern fĂźhren. Fehler dieses Typs sind sehr unwahrscheinlich, kĂśnnen nur sehr schwer festgestellt werden und haben bei Echtzeitanwendungen unter Umständen fatale Folgen. Sie dĂźrfen aber aus statistischen GrĂźnden nicht ausgeschlossen werden. Das berĂźhmte âUmfallen eines Bitsâ im Speicher oder auf der Festplatte auf Grund der beschriebenen EinflĂźsse stellt zum Beispiel solch einen Fehler dar. Da die Auswirkungen eines solchen Fehlers (z. B. Absturz des Systems oder Boot-Unfähigkeit, weil eine Systemdatei beschädigt wurde) von denen anderer Programmfehler meist nur sehr schwer unterschieden werden kĂśnnen, vermutet man oft eine andere Ursache, zumal ein solcher Fehler häufig nicht reproduzierbar ist.
⢠Programmfehler vs. Softwarefehler: Soweit diese beiden Bezeichnungen nicht als Synonyme verstanden werden, kann â entsprechend dem Bedeutungsunterschied zwischen Computerprogramm und Software â auch fĂźr âSoftwarefehlerâ eine breitere Definition zutreffen: Danach wären etwa auch Fehler oder Mängel in der Dokumentation Softwarefehler, unabhängig davon, ob sie zu fehlerhaften Programmen fĂźhrten. Auch dĂźrften fehlerhafte Daten (auch dieser Begriff wird je nach Definition der Software zugerechnet) kaum als Programm-, sondern, wenn Ăźberhaupt, hĂśchstens als Softwarefehler gelten.
⢠Technische Schulden und Qualitätsmängel: Gemäà ISO 9000 ist ein Fehler die âNichterfĂźllung einer Anforderungâ. Anforderungen wiederum werden definiert als âErfordernis oder Erwartung, das oder die festgelegt, Ăźblicherweise vorausgesetzt oder verpflichtend istâ.cite-ref-iso-9000-2-1[2] Dazu gehĂśrt auch das Nichtvorhandensein von technischen Schulden oder sonstigen Qualitätsmängeln.
Bei manchen Projekten wird nicht der Begriff Bug verwendet, sondern man spricht zum Beispiel von Metabugs, bei denen ein Bug ein Element einer Aufgabenliste darstellt. Bei einigen Projekten spricht man stattdessen auch von âIssuesâ (Angelegenheiten), da sich dieser Ausdruck nicht auf Programmfehler beschränkt.
Konkrete Beispiele von Fehlern mit medial besonderer Wirkung finden sich in der Liste von Programmfehlerbeispielen.
Wirtschaftliche Bedeutung
Softwarefehler sind weit mehr als nur ärgerliche Begleitumstände fßr Softwareentwickler, sondern sie verursachen aus betriebswirtschaftlicher und Ükonomischer Sicht erhebliche Kosten. Die IX-Studie 1/2006cite-ref-9[9] zeigte z. B. folgende fßr Deutschland ermittelte Werte:
⢠Ca. 84,4 Mrd. Euro betragen die jährlichen Verluste durch Softwarefehler in Mittelstands- und GroĂunternehmen
⢠Ca. 14,4 Mrd. Euro jährlich (35,9 % des IT-Budgets) werden fßr die Beseitigung von Programmfehlern verwendet;
⢠Ca. 70 Mrd. Euro betragen die Produktivitätsverluste durch Computerausfälle aufgrund fehlerhafter Software
In derselben Studie wird auch die Entwicklung der Softwarequalität fĂźr die Zeit von 2002 bis 2004 untersucht â mit dem Ergebnis:
⢠die Quote gescheiterter Projekte stieg von 15 % auf 18 %
⢠die Quote erfolgreicher Projekte sank von 34 % auf 29 %
⢠die Quote der Projekte mit Kostenßberschreitung stieg von 43 % auf 56 %
⢠die Quote der Projekte mit Terminßberschreitung stieg von 82 % auf 84 %
⢠die Quote der Projekte mit passender Funktionalität sank von 67 % auf 64 %
Fßr die USA werden die Kosten von Programmierfehlern 2022 auf 2,41 Billionen Dollar geschätzt, davon 1,81 Billionen fßr Fehler im Betrieb, 607 Milliarden fßr die Fehlersuche und -behebung und 260 Milliarden fßr fehlerbedingte Projektabbrßche.cite-ref-10[10]
Besonders viele Misserfolge zeigt ein Bericht des obersten Rechnungshofs fĂźr neue Projekte (1985) bei der US-Bundesverwaltung,cite-ref-wallm-swq-11-0[11] wonach
⢠27 % der bezahlten Software nie geliefert wurden,
⢠52 % nie funktionierten,
⢠18 % erst nach einer aufwändigen Sanierung zum Einsatz kamen.
⢠Lediglich 3 % der in Auftrag gegebenen Software erfßllten die vereinbarten Vertragsbedingungen.
Die Standish Group International stellte fest:cite-ref-12[12] Durchschnittlich Ăźberschreiten Projekte
⢠die ursprßnglich geplanten Projektkosten um 89 %
⢠die geplanten Termine um 222 %.
Als Grßnde fßr Projektabbrßche aufgrund schlechter Softwarequalität ermittelte Ewusi-Menach folgende Faktoren:cite-ref-wallm-swq-11-1[11]
⢠Unklare Zielsetzung
⢠Falsche Projektteambesetzung
⢠Unzulängliche Qualitätssicherung
⢠Fehlendes technisches Know-how
⢠Unzureichende Berßcksichtigung der Ausgangssituation
⢠Mangelnde Beteiligung der Anwender
Die Kosten fßr Debugging und Beseitigung bei in späteren Projektphasen bzw. in Produktion gefundenen Fehlern ßbersteigen ßblicherweise die Kosten fßr das Verhindern und Finden von Fehlern.cite-ref-13[13] Studien belegen daher, dass es oft gßnstiger ist, qualitativ hochwertige Software zu entwickeln, als qualitativ minderwertige.cite-ref-14[14]
Vermeidung, Auffindung und Behebung von Programmfehlern
Generell gilt:cite-ref-15[15] Je frßher im Entwicklungsprozess der Fehler auftritt und je später er entdeckt wird, umso aufwändiger wird es, den Fehler zu beheben. Im Schnitt rechnet man mit Kosten von 16.000 Dollar je in Produktion gefundenem Bug, während die Kosten fßr das Verhindern von Fehlern während der Designphase bei 25 Dollar liegen.cite-ref-16[16]
Während der Planung
Am wichtigsten ist eine gute und geeignete Planung des Entwicklungsprozesses. Hierfßr gibt es bereits etliche Vorgehensmodelle, aus denen ein geeignetes ausgewählt werden kann.
In der Analysephase
Ein Problem ist, dass die Korrektheit eines Programms nur gegen eine entsprechend formalisierte Spezifikation bewiesen werden kann. Eine solche Spezifikation zu erstellen kann jedoch im Einzelfall ähnlich kompliziert und fehlerträchtig sein, wie die Programmierung des Programms selbst.
In der Entwurfsphase
Softwareexperten sind sich darĂźber einig, dass praktisch jedes nicht-triviale Programm Fehler enthält. Deshalb wurden Techniken entwickelt, mit Fehlern innerhalb von Programmen tolerant umzugehen. Zu diesen Techniken gehĂśren defensives Programmieren, Ausnahmebehandlung, Redundanz und die Ăberwachung von Programmen (z. B. durch Watchdog-Timer) sowie die Plausibilisierung des Programmes während der Entwicklung und der Daten während des Programmablaufs.
Bei der Programmierung
Die Entwicklung immer abstrakterer Programmierparadigmen und Programmierstile wie die funktionale Programmierung, objektorientierte Programmierung, Design by contract und die aspektorientierte Programmierung dienen unter anderem der Fehlervermeidung und Vereinfachung der Fehlersuche. Aus den zur Verfßgung stehenden Techniken fßr das Problem ist eine geeignete auszuwählen. Ein wichtiger Punkt hierbei ist aber auch, dass fßr das jeweilige Paradigma erfahrene Programmierer zur Verfßgung stehen mßssen, sonst entsteht oft der gegenteilige Effekt.
Ferner ist es sehr nĂźtzlich, von den Entwicklungswerkzeugen mĂśglichst viele Aufgaben der Fehlervermeidung zuverlässig und automatisch erledigen zu lassen, was z. B. mit Hilfe von strukturierter Programmierung erleichtert wird. Dies betrifft zum einen bereits Kontrollen wie Sichtbarkeitsregeln und Typsicherheit, sowie die Vermeidung von ZirkelbezĂźgen, die bereits vor der Ăbersetzung von Programmen vom Compiler Ăźbernommen werden kĂśnnen, aber auch Kontrollen, die erst zur Laufzeit durchgefĂźhrt werden kĂśnnen, wie zum Beispiel IndexprĂźfung bei Datenfeldern oder TypprĂźfung bei Objekten der objektorientierten Programmierung.
Darßber hinaus wird eine Reihe fortgeschrittener Anwendungen angeboten, die entweder den Quellcode oder den Binärcode analysieren und versuchen, häufig gemachte Fehler automatisiert zu finden. In diese Kategorie fallen etwa Programme zur Ausfßhrungsßberwachung, die ßblicherweise fehlerhafte Speicherzugriffe und Speicherlecks zuverlässig aufspßren. Beispiele sind das frei erhältliche Tool Valgrind und das kommerzielle Purify. Eine weitere Kategorie von Prßfprogrammen umfasst Anwendungen, die Quell- oder Binärcode statisch analysieren und etwa nicht geschlossene Ressourcen und andere Probleme auffinden und melden kÜnnen. Darunter fallen etwa FindBugs, Lint und Splint.
Beim Testen
Es ist durchaus sinnvoll, dass der Test vor dem eigentlichen Programm entwickelt wird. Damit wird erreicht, dass nicht ein Test geschrieben wird, der zu dem bereits geschriebenen Programm passt. Dies kann durch Ermittlung von Testfällen anhand der Spezifikation bereits während der Analyse- bzw. Designphase erfolgen. Die Ermittlung von Testfällen in diesem frĂźhen Stadium der Softwareentwicklung ermĂśglicht zudem die PrĂźfung der Anforderungen an das Programm auf Testbarkeit und Vollständigkeit. Die anhand der Spezifikation ermittelten Testfälle sind die Basis fĂźr die Abnahmetests â die kontinuierlich Ăźber den gesamten Entwicklungsprozess verfeinert und z. B. fĂźr eine Testautomatisierung vorbereitet werden kĂśnnen.
Manche Softwareanbieter fßhren Testphasen teilweise Üffentlich durch und geben Betaversionen heraus, um die unvorhersehbar vielfältigen Nutzungsbedingungen verschiedener Anwender durch diese selbst testen und kommentieren zu lassen.
Im Betrieb
Tritt ein Fehler während des Betriebs auf, so muss versucht werden, seine Auswirkungen mĂśglichst gering zu halten und seinen Wirkungskreis durch Schaffung von âSchutzwällenâ oder âSicherungenâ einzudämmen. Dies erfordert zum einen MĂśglichkeiten der Fehlererkennung und zum anderen, adäquat auf einen Fehler reagieren zu kĂśnnen.
Ein Beispiel zur Fehlererkennung zur Laufzeit eines Computerprogrammes sind Assertions, mit deren Hilfe Bedingungen abgefragt werden, die gemäà Programmdesign immer erfßllt sind. Weitere Mechanismen sind Ausnahmebehandlungen wie Trap und Exception.
Durch die Implementierung von Proof-Carrying Code kann die Software zur Laufzeit ihre Zuverlässigkeit in gewissem Rahmen gewährleisten und sicherstellen.
Fehlerfreiheit
VĂśllige Fehlerfreiheit fĂźr Software, die eine gewisse Komplexitätsgrenze Ăźberschreitet, ist praktisch weder erreich- noch nachweisbar. Mit steigender Komplexität sinkt die Ăberblickbarkeit, insbesondere auch, wenn mehrere Personen an der Programmierung beteiligt sind. Selbst teure oder vielfach getestete Software enthält Programmierfehler. Man spricht dann bei gut brauchbaren Programmen nicht von Fehlerfreiheit, sondern von Robustheit. Eine Software gilt dann als robust, wenn Fehler nur sehr selten auftreten und diese dann nur kleinere Unannehmlichkeiten mit sich bringen und keine grĂśĂeren Schäden oder Verluste verursachen.
In Spezialfällen ist ein Beweis der Fehlerfreiheit (bzgl. der festgelegten Anforderungen) eines Programms mĂśglich. Insbesondere in Bereichen, in denen der Einsatz von Software mit hohen finanziellen, wirtschaftlichen oder menschlichen Risiken verbunden ist, wie z. B. bei militärisch oder medizinisch genutzter Software oder in der Luft- und Raumfahrt, verwendet man zudem eine â(formale) Verifizierungâ genannte Methode, bei der die Korrektheit einer Software formal-mathematisch nachgewiesen wird. Dieser Methode sind allerdings wegen des enormen Aufwands enge Grenzen gesetzt und sie ist daher bei komplexen Programmen praktisch unmĂśglich durchzufĂźhren (siehe auch Berechenbarkeit). Allerdings gibt es mittlerweile Werkzeuge, die diesen Nachweis laut eigenen Angaben zumindest fĂźr Teilbereiche (Laufzeitfehler) schnell und zuverlässig erbringen kĂśnnen.
Neben der mathematischen Verifizierung gibt es noch eine praxistaugliche Form der Verifizierung, die durch die Qualitätsmanagement-Norm ISO 9000 beschrieben wird. Bei ihr wird formal nur dann ein Fehler konstatiert, wenn eine Anforderung nicht erfĂźllt ist. Umgekehrt kann demnach ein Arbeitsergebnis (und damit auch Software) als âfehlerfreiâ bezeichnet werden, wenn es nachweisbar alle Anforderungen erfĂźllt. Die ErfĂźllung einer Anforderung wird dabei durch Tests festgestellt. Bringen alle zu einer Anforderung definierten Tests die erwarteten Ergebnisse, so ist die Anforderung erfĂźllt. Gilt dies fĂźr die Tests aller Anforderungen (korrektes und vollständiges Testen vorausgesetzt), so wird âfehlerfrei bzgl. der Anforderungenâ gefolgert. Sind die den Tests zugrundeliegenden Anforderungen fehlerhaft oder unvollständig, so arbeitet die Software dementsprechend dennoch nicht âwie gewĂźnschtâ.
Klassifizierung von Fehlern
Aufgetretene Fehler werden im Allgemeinen im Fehlermanagement systematisch bearbeitet. Nach der IEEE-Norm 1044 (Klassifizierung von Softwareanomalien) durchläuft dabei jeder Fehler einen sogenannten Klassifizierungsprozess, bestehend aus den vier Schritten Erkennung (Recognition), Analyse (Investigation), Bearbeitung (Action) und Abschluss (Disposition).cite-ref-17[17] In jedem dieser Schritte werden die Verwaltungsaktivitäten Aufzeichnen (Recording), Klassifizieren (Classifying), Wirkung identifizieren (Identifying Impact) ausgefßhrt.cite-ref-ieee-1044en-18-0[18]
Kriterien, nach denen Fehler dabei klassifiziert werden kĂśnnen, sind u. a. (mit Beispielen):
â
Hauptartikel
:
Fehlerklassifizierung
⢠die Art des Fehlers: Nachcite-ref-unio-8-1[8] werden dabei unterschieden: Lexikalische Fehler (unbekannter Bezug), syntaktische Fehler (vergessenes Semikolon), semantische Fehler (falsche Deklaration), Laufzeitfehler (falsch formatierte Eingabedaten) und logische Fehler (plus statt minus, Schleifenfehler, âŚ)
⢠die Fehlerursache: unpräzise Vorgabe, Zahlendreher, falsche Formel, nicht geprĂźfte (falsche) Eingabedaten âŚ
⢠der Zeitpunkt der Fehlerentstehung (âFehlhandlungâ): Bereits bei der Programmvorgabe, im Codeentwurf, beim Codieren, âŚ
⢠der Zeitpunkt des Fehlerauftretens (âFehlerwirkungâ): Ein grundsätzlicher Unterschied ergibt sich daraus, ob der Fehler während der Programmentwicklung auftritt, zum Beispiel beim Testen (hier ist dies ein Normalfallcite-ref-pks-1-1[1]) oder im produktiven Betrieb (wo er häufig eine kritische StĂśrung darstellt).
⢠der Zeitpunkt der Entdeckung: Je länger die âFehlerverweilzeitâ ist, desto aufwändiger wird i. A. die KorrekturmaĂnahme verlaufen.
⢠die Reproduzierbarkeit des Fehlers: Je schwieriger ein Fehler reproduzierbar ist, desto aufwändiger wird i. A. die KorrekturmaĂnahme verlaufen.
⢠die Auswirkung(en) des Fehlers: Darstellungsfehler, falsches Ergebnis, Programmabbruch, AuĂenwirkung âŚ
⢠Aufwand und Dauer zur Fehlerbehebung: minimal ⌠sehr hoch; sofort ⌠sehr lange Dauer;
⢠Bearbeitungsstatus: aufgetreten, untersucht, Korrekturauftrag in Bearbeitung, Retest mĂśglich, âŚ, erledigt
Mit Hilfe von Metriken âsollten die Ergebnisse [und Erkenntnisse Ăźber Fehler] auch Anlass zur Suche nach den Ursachen hinter den Problemen seinâ.cite-ref-pks-1-2[1] âFehlerklassifikationen bilden die Grundlage fĂźr standardisierte Verfahren zur Fehlerbehandlung und unterstĂźtzen zudem eine kontinuierliche Qualitätsverbesserung im Sinne des Qualitätsmanagements.âcite-ref-bitkom-19-0[19] Weitere Angaben je Fehler wie eine ausfĂźhrliche Fehlerbeschreibung, betroffene Programme, beteiligte Personen etc. begleiten die MaĂnahmen zur Behebung der Fehler und dokumentieren diese. Näheres siehe BITKOM-Leitfaden.cite-ref-bitkom-19-1[19]
Vereinfachend werden Programmfehler im Fehlerbearbeitungsprozess häufig nur nach der Fehlerschwere, das schlieĂt auĂerdem die Fehlerwirkung und den Behebungsaufwand ein, in Kategorien/Klassen wie A, B, C, ⌠oder 1, 2, 3, ⌠usw. eingeteilt. Beispiele siehe BITKOM-Leitfaden,cite-ref-bitkom-19-2[19] insbesondere im Anhang.
Folgen von Programmfehlern
Die Folgen von Programmfehlern kĂśnnen hochgradig unterschiedlich sein und sich in vielfältiger Weise zeigen. Werden Fehler im Rahmen der Entwicklungsprozesse entdeckt, so beschränken sich die Fehlerfolgen auĂerdem auf die Ăberarbeitung der Software (Codekorrekturen, KonzeptĂźberarbeitung, Dokumentation âŚ) â je nach Situation mit mehr oder weniger groĂen Auswirkung auf das Projektbudget und die Projektdauer. Dagegen wirken erst im Produktivbetrieb erkannte Fehler nicht selten ungleich kritischer, zum Beispiel kĂśnnen sie Prozess-StĂśrungen oder Produktionsstillstand bewirken, Imageschäden hervorrufen, den Verlust von Kunden und Märkten verursachen, Regresspflichten auslĂśsen oder gar das Unternehmen in Existenzgefahr bringen. Fehler in technischen Anwendungen kĂśnnen im schlimmsten Fall zu Katastrophen fĂźhren.
Konkrete Beispiele fĂźr Programmfehler und deren Folgen finden sich in der Liste von Programmfehlerbeispielen.
Reproduzierbarkeit von Programmfehlern
Manche Programmfehler sind nur äuĂerst schwer oder gar nicht zuverlässig reproduzierbar. Bei der Wiederholung eines zuvor gescheiterten Vorgangs unter scheinbar unveränderten Bedingungen ist die Wahrscheinlichkeit gegeben, dass sich diese Fehler nicht erneut äuĂern. Es gibt zwei mĂśgliche GrĂźnde fĂźr dieses Verhalten: Zum einen kann es zu VerzĂśgerungen zwischen der Fehleraktivierung und dem letztlich auftretenden Problem beispielsweise einem Programmabsturz kommen, welche die tatsächliche Ursache verschleiern und deren Identifikation erschweren. Zum anderen kĂśnnen andere Elemente des Softwaresystems (Hardware, Betriebssystem, andere Programme) das Verhalten der Fehler in dem betrachteten Programm beeinflussen. Ein Beispiel hierfĂźr sind Fehler, die in nebenläufigen Umgebungen mit mangelnder Synchronisation (genauer: Sequentialisierung) auftreten. Wegen der hieraus folgenden Wettlaufsituationen (Race Conditions) kĂśnnen die Prozesse in einer Reihenfolge abgearbeitet werden, welche zu einem Laufzeitfehler fĂźhrt. Bei einer Wiederholung der gleichen Aktion ist es mĂśglich, dass die Reihenfolge der Prozesse unterschiedlich ist und kein Problem auftritt.
Die Reproduzierbarkeit eines Programmfehlers lässt sich anhand dessen Beobachtungsgßte in Kategorien/Klassen wie A, B, C ... oder 1, 2, 3 ... usw. einteilen. Die Beobachtungsstufe eines Fehlers kann sich ßber die Nutzungszeit der Software verändern, so kann sich bspw. ein nicht reproduzierbarer Fehler zu einem eindeutig reproduzierbaren Fehler entwickeln. Bei nicht ohne weiteres reproduzierbaren Fehlern, welche aber wiederholt aufgetreten sind, kÜnnen Experten zur Ursachensuche hinzugezogen werden.
⢠A: Eindeutig festgestellter Fehler, welcher mit Belegen jederzeit reproduziert werden kann.
⢠B: Nicht ohne weiteres reproduzierbarer Fehler, welcher aber nachweislich wiederholt aufgetreten ist.
⢠C: Nicht reproduzierbarer und nicht nachweislich wiederholt aufgetretener Fehler.
WeiterfĂźhrende Themen
⢠Zum Prinzip, noch âunreifeâ Software auszuliefern, siehe Bananenware.
⢠Software, die (oft kostenlos angeboten) z. B. Mängel in der Sicherheit, der Ăbersichtlichkeit oder ihrer nutzbaren Funktionalität aufweist; siehe Crapware
Literatur
⢠William E. Perry: Software Testen. Mitp-Verlag, Bonn 2002, ISBN 3-8266-0887-9.
⢠Elfriede Dustin, Jeff Rashka, John Paul: Software automatisch testen. Verfahren, Handhabung und Leistung. Springer, Berlin u. a. 2001, ISBN 3-540-67639-2.
⢠Cem Kaner, Jack Falk, Hung Quoc Nguyen: Testing Computer Software. 2nd edition. John Wiley & Sons, New York NY u. a. 1999, ISBN 0-471-35846-0.
Weblinks
Wiktionary: Programmfehler
â Bedeutungserklärungen, Wortherkunft, Synonyme, Ăbersetzungen
⢠Die 25 gefährlichsten Programmierfehler (englisch)
⢠SQS: Die spektakulärsten Softwarefehler 2012. In: Computerwoche. 17. Januar 2013, abgerufen am 20. Januar 2013.
Einzelnachweise
cite-note-pks-11. â M. Pol, T. Koomen, A. Spillner: Management und Optimierung des Testprozesses. dpunkt.Verlag, Heidelberg 2002, ISBN 3-89864-156-2.
cite-note-iso-9000-22. â DIN-Normenausschuss Qualitätsmanagement, Statistik und Zertifizierungsgrundlagen (NQSZ): DIN EN ISO 9000. Qualitätsmanagementsysteme - Grundlagen und Begriffe. Hrsg.: DIN Deutsches Institut fĂźr Normung e. V. Beuth Verlag GmbH, Berlin November 2015, 3.6.9, S. 40 (104 S.).
cite-note-33. â Spillner et al. Praxiswissen Softwaretest - TestmanagementLeseprobe Kap. 1.1 Basiswissen / Fehlerbegriff (Memento vom 17. Dezember 2010 im Internet Archive) (PDF) dpunkt.de
cite-note-44. â Merriam-Webster Unabridged Dictionary (iOS-App, 2016): bug: a) an insect or other creeping or crawling invertebrate ⌠b) any of certain insects commonly considered especially obnoxious ⌠c) an insect of the order Hemiptera, especially: a member of the suborder Heteroptera âŚ
cite-note-61. Paul B. Israel (Hrsg.): The Papers of Thomas A. Edison. Vol. 4, Baltimore and London, 1993 (Online).
cite-note-77. â Fred R. Shapiro: Etymology of the Computer Bug: History and Folklore. In: American Speech. Band 62, Nr. 4, 1987, S. 376â378.
cite-note-unio-88. â SicherheitslĂźcken im Internet â Fehler im Programmcode. In: informatik.uni-oldenburg.de. Archiviert vom Original am 28. März 2023; abgerufen am 22. Juli 2024.
cite-note-99. â iX-Magazin, Studie Software-Testmanagement, war frĂźher im IX Kiosk erwerbbar (Memento vom 9. Januar 2013 im Internet Archive)
cite-note-1010. â Herbert Krasner: The Cost of Poor Software Quality in the US. A 2022 Report - From Problem to Solutions. Hrsg.: Consortium for Information & Software Quality. 15. Dezember 2022, S. 3â4 (englisch, 61 S., it-cisq.org [PDF; abgerufen am 25. September 2024]).
cite-note-wallm-swq-1111. â WallmĂźller: Software-Qualitätsmanagement in der Praxis, beck-shop.de (PDF; 612 kB), Hanser, MĂźnchen 2001, ISBN 978-3-446-21367-8.
cite-note-1212. â Junginger: Wertorientierte Steuerung von Risiken im Informationsmanagement. 2005, ISBN 3-8244-8225-8.
cite-note-1313. â Steve C. McConnel: Code Complete. 2. Auflage. Microsoft Press, 2004, ISBN 0-7356-1967-0, 20.5, S. 474 (englisch, 914 S.): âThe single biggest activity on most projects is debugging and correcting code that doesnât work properly. Debugging and associated rework consume about 50 percent of the time on a traditional, naive software-development cycle.â
cite-note-1414. â Capers Jones: Software Assessments, Benchmarks, and Best Practices. Addison-Wesley, 2000, ISBN 0-201-48542-7, Kap. 3, S. 99 (englisch, archive.org [abgerufen am 29. Mai 2022]): âThe relationship between quality and productivity is well supported by emperical data, even if the topic is not well understood by the industry as a whole. As far back as the early 1970s, IBM discovered that software projects with the lowest levels of defects had the shortest development schedules and the highest development productivity. The reason for this situation is because software defect removal is actually the most expensive and time-consuming form of work for software.â
cite-note-1515. â Georg Edwin Thaller Softwaretest, Verifikation und Validation 2002, ISBN 978-3-88229-198-8.
cite-note-1616. â John Ronald-Cummings, Peer Owais: Leading Quality. How Great Leaders Deliver High Quality Software and Accelerate Growth. Hrsg.: ROI Press. 2019, ISBN 978-1-916185-80-7, S. 64 (englisch, 154 S.): âResearch by Capers Jones found that the cost to address bugs post-release is $16,000, but a bug found at the design phase costs $25.â
cite-note-1717. â my.safaribooksonline.com
cite-note-ieee-1044en-1818. â IEEE Standard Classification for Software Anomalies. (PDF) IEEE Standards Board, 1993, S. 32, abgerufen am 22. November 2014 (White Paper; Dokument hinter Paywall).
cite-note-bitkom-1919. â Bitkom Leitfaden Fehlerklassifikation fĂźr Software | Bitkom e. V. Abgerufen am 26. Juli 2022.